package com.qianbao.finance.sync.modules.elasticsearch.service;


import com.qianbao.finance.sync.modules.elasticsearch.model.DatabaseTableModel;
import com.qianbao.finance.sync.modules.elasticsearch.model.IndexTypeModel;
import com.qianbao.finance.sync.modules.elasticsearch.model.SyncMappingConfig;
import com.qianbao.finance.sync.modules.elasticsearch.model.request.InitMappingRequest;

import java.util.List;
import java.util.Map;

public interface MappingService {

    /**
     * 通过database和table，获取与之对应的index和type
     *
     * @param databaseTableModel mysql
     * @return Elasticsearch
     */
    IndexTypeModel getIndexType(DatabaseTableModel databaseTableModel);

    /**
     * 通过index和type，获取与之对应的database和table
     *
     * @param indexTypeModel Elasticsearch
     * @return mysql
     */
    DatabaseTableModel getDatabaseTableModel(IndexTypeModel indexTypeModel);

    /**
     * 获取数据库表的主键映射
     */
    Map<String, String> getTablePrimaryKeyMap();

    /**
     * 设置数据库表的主键映射
     */
    void setTablePrimaryKeyMap(Map<String, String> tablePrimaryKeyMap);

    /**
     * 获取Elasticsearch的数据转换后类型
     *
     * @param mysqlType mysql数据类型
     * @param data      具体数据
     * @return Elasticsearch对应的数据类型
     */
    Object getElasticsearchTypeObject(String mysqlType, String data);

    /**
     * 在ES中初始化mapping信息
     * @param request
     * @param
     * @return
     */
    String initMapping(InitMappingRequest request);

    /**
     * 生成canal版本需要的配置信息
     * @param database
     * @return
     */
    boolean makeMappingStep(String database);

    /**
     * 生成go版本里边需要的配置
     */
    boolean makeGoMappingStep(String database);


    /**
     * 通过配置文件，同步数据库
     * @param stepSize
     * @return
     */
    String syncByConfig(Integer stepSize);

    /**
     * 清空所有的索引
     * @return
     */
    String removeAll();

    /**
     * 清空es根据databaseName
     * @param databaseName
     * @return
     */
    String removeEsByDataBase(String databaseName);

    /**
     * 在ES中初始化mapping信息
     * @param databaseName
     * @param
     * @return
     */
    String initMappingByDataBase(String databaseName);

    /**
     * 通过配置文件，同步数据库
     * @param databaseName
     * @return
     */
    String byConfigByDataBase(String databaseName);

    Map<String, String> getDbEsMapping();

    List<SyncMappingConfig> listDbEsMapping();

    List<SyncMappingConfig> getSyncMappingConfigList();

    Map<String, SyncMappingConfig> getSyncMappingConfigMap();

    void updateSyncMappingConfig(String dbName, String tableName, int changeCount);
}
